package com.kamistoat.netty.nio;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

/**
 * 使用channel向文件中写入数据
 */
public class NIOFileChannel01 {
    public static void main(String[] args) throws IOException {
        String str = "hello, kamistoat";

        // 创建一个输出流
        FileOutputStream fileOutputStream =
                new FileOutputStream("/home/kamistoat/ubuntu/Netty_Learning/src/main/java/com/kamistoat/netty/nio/file01.txt");

        // 获取输出流中的channel，java原生的FileOutputStream中包裹了channel
        // 虽然返回值值FileChannel，但实际类型是 FileChannelImpl
        FileChannel fileChannel = fileOutputStream.getChannel();

        // 创建一个缓冲区
        ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
        // 将字节放入缓冲区中
        byteBuffer.put(str.getBytes());

        // 将缓冲区中的数据写入到channel中。注意此时对于buffer来说是一个读动作，因此需要先执行flip对buffer进行翻转
        byteBuffer.flip();
        // 再向channel中写入buffer中的数据
        // 查看write()实现的源码，发现就是向文件句柄写入buffer中的数据
        fileChannel.write(byteBuffer);

        // 由于这里的FileChannel都是包裹在FileStream中的，所以直接关闭Stream就可以一起关闭CHannel
        fileOutputStream.close();
    }
}
